package com.demo.jzoffer2;

import com.demo.domain.TreeNode;
import org.junit.Test;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * @author gy
 * @date 2022/11/15
 */
public class Test1222_02 {
    /**
     *从上到下按层打印二叉树，同一层的节点按从左到右的顺序打印，每一层打印到一行。
     *     3
     *    / \
     *   9  20
     *     /  \
     *    15   7
     *
     *    [
     *   [3],  偶数层正序
     *   [20,9],  奇数层倒叙
     *   [15,7] 偶数层正序
     * ]
     * @param root
     * @return
     */
    public List<List<Integer>> levelOrder(TreeNode root) {
        // 初始化队列用于存储二叉树节点
        Queue<TreeNode> queue = new LinkedList<>();
        // 初始化集合 用于存储遍历结果
        List<List<Integer>> res = new ArrayList<>();
        // 根节点入队
        if (root != null) {
            queue.add(root);
        }
        while (!queue.isEmpty()) {
            //创建临时集合用于存储每层的数节点
            // 此处需要双端队列来实现 正序倒叙效果  关键
            LinkedList<Integer> tmp = new LinkedList<>();
            for (int i = queue.size(); i > 0; i--) {
                TreeNode node = queue.poll();
                // 返回结果的数量的奇偶与层数的奇偶保持一致  关键
                if (res.size() % 2 == 0){
                    // 往队列的末尾添加 相当于正序  偶数层->队列尾部
                    tmp.addLast(node.val);
                }else{
                    // 往队列的首部添加 相当于倒叙  奇数层->队列头部
                    tmp.addFirst(node.val);
                }
                // 若树节点的左右节点不为null，开始入队
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
            res.add(tmp);
        }
        return res;
    }

    @Test
    public void m1() {
        LinkedList<Integer> tmp = new LinkedList<>();
        tmp.addLast(1);
        tmp.addLast(2);
        tmp.addLast(3);
        System.out.println(tmp);
        LinkedList<Integer> tmp2 = new LinkedList<>();
        tmp2.addFirst(1);
        tmp2.addFirst(2);
        tmp2.addFirst(3);
        System.out.println(tmp2);
    }

}
